package com.cmwa.solution.sys.permission.dataRole.service.impl;

import java.util.List;

import javax.annotation.Resource;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Service;

import com.cmwa.solution.base.entity.SearchParam;
import com.cmwa.solution.sys.permission.dataAuthority.entity.RoleVo;
import com.cmwa.solution.sys.permission.dataRole.dao.RoleDao;
import com.cmwa.solution.sys.permission.dataRole.dao.RoleEmployeeRelationsDao;
import com.cmwa.solution.sys.permission.dataRole.entity.RoleEmployeeRelationsVo;
import com.cmwa.solution.sys.permission.dataRole.service.RoleEmployeeRelationsService;
import com.cmwa.solution.sys.permission.privilege.service.PrivilegeService;

/**
 * 角色员工关系业务实现类
 * @author ex-weicb
 * @Date 2016年4月28日 下午2:32:43
 * @Description
 */
@Service
public class RoleEmployeeRelationsServiceImpl implements RoleEmployeeRelationsService {
	
	private static final Log log = LogFactory.getLog(RoleEmployeeRelationsServiceImpl.class);
	@Resource
	private RoleEmployeeRelationsDao roleEmployeeRelationsDao;
	@Resource
	private RoleDao roleDao;
	@Resource
	private PrivilegeService privilegeService; 
	
	/**
	 * 批量新增角色员工关系数据
	 * @author ex-weicb
	 * @createDate 2016年4月28日 下午2:34:23
	 * @param param
	 */
	public void batchInsert(SearchParam param){
		roleEmployeeRelationsDao.batchInsert(param);
	}
	
	/**
	 * 根据角色id删除角色员工关系数据
	 * @author ex-weicb
	 * @createDate 2016年4月29日 上午10:40:43
	 * @param roleId
	 */
	public void deleteByRoleId(String roleId){
		roleEmployeeRelationsDao.deleteByRoleId(roleId);
	}

	/**
	 * 根据员工id查询角色员工关系数据
	 * @author ex-qiuzw
	 * @createDate 2016年10月13日 上午14:18:28
	 * @param empId
	 */
	public List<RoleEmployeeRelationsVo> queryRelationsByEmpId(String empId) {
		return roleEmployeeRelationsDao.queryRelationsByEmpId(empId);
	}
	
	/**
     * 更新入司、离司人员的权限（定时任务）
     * @author ex-sujh
     * @date 2018年7月9日10:15:33
     */
	@Override
	public void updateEmpAuthority() {
		this.updateNewEmpAuthority();   // 处理入司
		this.updateLeaveEmpAuthority(); // 处理离司
		privilegeService.executeUpdateLimit();  // 更新人-资源关联关系表
	}
	
	/**
	 * 处理新入司但未关联数据权限的员工信息
	 */
	private void updateNewEmpAuthority() {
		log.error("定时任务：开始处理入司但未关联数据角色的人员");
		Long start = System.currentTimeMillis();
		// 查询入司但未关联数据角色的员工
		List<RoleEmployeeRelationsVo> newEmpList = roleEmployeeRelationsDao.queryNewEmpList();
		
		if (CollectionUtils.isNotEmpty(newEmpList) && newEmpList.size() > 0) {
			// 根据部门分别查找对应的数据权限关联
			for (int i = 0; i < newEmpList.size(); i++) {
				String empId = newEmpList.get(i).getEmpId();
				String orgId = newEmpList.get(i).getOrgId();
				
				RoleVo vo = new RoleVo();
				vo.setOrgId(orgId);
				// 根据部门查询对应的数据角色集合
				List<RoleVo> authorityList = roleDao.queryRoleByDeptId(vo);
				if (CollectionUtils.isNotEmpty(authorityList) && authorityList.size() > 0) {
					
					for (int j = 0; j < authorityList.size(); j++) {
						RoleEmployeeRelationsVo roleEmployeeRelationsVo = new RoleEmployeeRelationsVo();
						roleEmployeeRelationsVo.setEmpId(empId);
						roleEmployeeRelationsVo.setRoleId(authorityList.get(j).getRoleId());
						// 查询是否存在关联关系
						int count = roleEmployeeRelationsDao.countRoleEmployeeRelation(roleEmployeeRelationsVo);
						// 不存在则新增
						if (count == 0) {
							roleEmployeeRelationsDao.saveRoleEmployeeRelation(roleEmployeeRelationsVo);
						}
					}
				} else {
					log.error("(" + empId + ")该员工所在的部门(" + orgId + ")未找到对应的数据角色");
				}
			}
		} else {
			log.error("定时任务(处理入司但未关联数据角色的人员): 未查询到已入职，但未关联数据角色的人员。");
		}
		Long end = System.currentTimeMillis();
		log.error("定时任务：处理入司但未关联数据角色的人员结束，共耗时(ms)： " + (end - start));
	}
	
	/**
	 * 处理离司但未清除数据角色的员工信息
	 */
	private void updateLeaveEmpAuthority() {
		log.error("定时任务：开始处理离司但未清除数据权限的员工信息");
		Long start = System.currentTimeMillis();
		//查询离司但未清除数据权限的员工信息
		List<RoleEmployeeRelationsVo> leaveEmpList = roleEmployeeRelationsDao.queryLeaveEmpList();
		if (CollectionUtils.isNotEmpty(leaveEmpList) && leaveEmpList.size() > 0) {
			log.error("定时任务(处理离司但未清除数据权限的员工信息): 清除完成，" + leaveEmpList);
			roleEmployeeRelationsDao.batchDeleteRoleEmployeeRelations(leaveEmpList);
		} else {
			log.error("定时任务(处理离司但未清除数据权限的员工信息): 未查询到已离司，但未清除数据权限的员工信息。");
		}
		Long end = System.currentTimeMillis();
		log.error("定时任务：处理离司但未清除数据权限的员工信息结束，共耗时： " + (end - start) + "ms");
	}
}
